'''
基于LittleC规则
(){},; | + - * / = > < >= <= == != | for return int if else while 
待判断的词类型为:运算符0 ,分隔符1 ,整数常量2 ,自定义标识符3 ,保留字4
'''
fileName=input("请输入文件名:")
oldLines=[]
newLines=[]

#有穷集合词符列表
separators=[')','(','}','{',',',';']
sOperators=['=','+','-','*','/','>','<']
dOperators=['=','<','>','!']
keyWords=['return','int','if','else','while']
#标志组
flagInteger=False      #整数标志
flagId=False           #标识符(含关键字)标志
flagDOp=False          #双字符算符标志  
'''
1.读出文件各行数据存入oldLines 
'''
with open(fileName,'r') as f:
    oldLines=f.readlines()
'''
2.开始逐行逐字符判断
'''
tmpWords=''
for line in oldLines:
  line+=' '                           #补一个空串 预防行结尾没有换行导致的判断丢失
  for char in line:
    #2.1 优先级高的判符
    if flagDOp:
      if char=='=':                   #是多目比较符
        tmpWords+='='
        newLines.append([0,tmpWords]) 
        continue
      elif char!='!':                 #只要不是! 就是一个单目比较符
        newLines.append([0,tmpWords])  
      flagDOp=False
      tmpWords=''
    elif flagInteger:
      if char.isdigit():
        tmpWords+=char
        continue
      else:
        newLines.append([2,tmpWords])  
        flagInteger=False
        tmpWords=''
    elif flagId:
      if char.isalpha() or char.isdigit() or char=='_':
        tmpWords+=char
        continue
      elif tmpWords in keyWords:
        newLines.append([4,tmpWords]) 
      else:
        newLines.append([3,tmpWords])
      flagId=False
      tmpWords=''

    #2.2  低优先级判断
    if char in separators:            #分隔符判断
      newLines.append([1,char])
    elif char in dOperators:          #多目算符疑似判断
      tmpWords+=char
      flagDOp=True
    elif char in sOperators:          #单目算符判断
      newLines.append([0,char]) 
    elif char.isalpha() or char=='_': #标识符或者保留字的疑似判断 遇到字母或者下划线 开头
      tmpWords+=char
      flagId=True 
    elif char.isdigit():               #整数的疑似判断  遇到数字开头
      tmpWords+=char
      flagInteger=True
    else:                              #其他情况 这种的暂时不加以处理      
      pass        

symbolTables={}
id=0
for token in newLines:
  #发现自定义标识符就加入符号表中 词法只做出现次数和次序统计 
  if token[0] ==3:
    #若未在词法表中注册  则注册一些属性
    if token[1] not in symbolTables.keys():
      symbolTables[token[1]]={"id":id,"value":'null',"address":'null',"cite":0}
      id+=1
    #若已在词法表中注册  则修改引用次数
    else:
      symbolTables[token[1]]["cite"]+=1

'''
4.读出文件各行数据存入oldLines 
'''
with open('output.txt','w') as f:
    for line in newLines:
        f.write(str(line)+"\n")
    f.write("***********symbolTables***********\n")
    for key,value in symbolTables.items():
      f.write(str(key)+"\t"+str(value)+"\n")
      